package Pages;

import org.openqa.selenium.*;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.util.List;
import java.util.Random;

import static org.openqa.selenium.support.ui.ExpectedConditions.presenceOfElementLocated;
import static org.openqa.selenium.support.ui.ExpectedConditions.stalenessOf;

/**
 * Created by Asus on 08.02.14.
 */
public class MainPage {
    // Локальные переменный (драйвер и url)
    private WebDriver driver;
    private String base_url;

    // Конструктор
    public MainPage(WebDriver driver, String base_url) {
        this.driver = driver;
        this.base_url = base_url;
    }

    // Переход на страницу
    public void go_to_page() {
        driver.get(this.base_url);
    }

    // Метод очистки поля
    private void clearField(WebElement element){
        element.sendKeys(Keys.CONTROL + "a");
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        element.clear();
    }

    // Метод авторизации
    public void authorize(String login, String password) {
        WebElement login_field = driver.findElement(By.id("username"));
        clearField(login_field);
        login_field.sendKeys(login);

        WebElement password_field = driver.findElement(By.name("password"));
        clearField(password_field);
        password_field.sendKeys(password);

        driver.findElement(By.name("submit")).click();
    }

    // Метод поиска фильма
    public SearchResultPage searchFilm(String film_name) {
        try {
            WebDriverWait wait = new WebDriverWait(driver, 10);

            // Очитка поля ввода поискового запроса
            WebElement input_field = driver.findElement(By.id("q"));
            clearField(input_field);

            // Фильм с главной (объект) должен смениться
            WebElement element_to_disappear = wait.until(presenceOfElementLocated(By.xpath("(//*[@class='movie_box'])[1]")));

            // Ввод поискового запроса
            input_field.sendKeys(film_name + Keys.RETURN);

            // Ожидание смены фильма
            wait.until(stalenessOf(element_to_disappear));
        }
        catch (NoSuchElementException e){
            throw new NoSuchElementException("Film not founded");
        }
        catch (TimeoutException e){
            throw new NoSuchElementException("Film not founded");
        }

        // Возвращение страницы поиска фильмов
        return new SearchResultPage(driver, film_name);
    }

    // Получение произвольного числа от min до max
    private static int randInt(int min, int max) {
        Random rand = new Random();
        return rand.nextInt((max - min) + 1) + min;
    }

    // Получение фильма для поиска со страницы
    public String getRandomFilmFromPage() {
        // Ожидание загрузки найденных фильмов
        // Сначала одного фильма
        WebDriverWait wait = new WebDriverWait(driver,10);
        wait.until(presenceOfElementLocated(By.cssSelector(".title")));

        // Получение всех филмов на странице
        List<WebElement> list_of_films = driver.findElements(By.cssSelector(".title"));

        // Получение название случайно выбранного фильма со страницы
        try {
            return list_of_films.get(randInt(0, list_of_films.size())).getText();
        }
        // В случае ошибки вернуть пустую строку
        catch (IndexOutOfBoundsException ex){
            return "";
        }
    }
}
